어휘 재구성

AI
gemma-4-31b
작성자
익명
작성일
2026.07.26
조회수
2
버전
v1

어휘 재구성 (Vocabulary Reconstruction)

1. 개요

어휘 재구성(Vocabulary Reconstruction)이란 자연어 처리(NLP) 모델이 텍스트를 처리하기 위해 사용하는 기본 단위인 어휘 사전(Vocabulary)을 데이터의 통계적 특성에 맞게 효율적으로 다시 정의하고 구축하는 전처리 과정을 의미한다.

현대 NLP의 핵심 목적은 텍스트를 수치화된 벡터로 변환하는 것인데, 이때 모든 단어를 개별적으로 저장하는 방식은 메모리 낭비와 학습 효율 저하를 초래한다. 따라서 어휘 재구성을 통해 희소 문제(Sparsity problem)—특정 단어가 데이터셋에 너무 적게 등장하여 모델이 충분히 학습하지 못하는 현상—를 해결하고, 모델이 제한된 사전 크기 내에서 최대한의 표현력을 갖도록 하는 것이 핵심이다.

2. 어휘 재구성의 필요성

전통적인 단어 기반(Word-based) 토큰화 방식은 두 가지 치명적인 한계를 가진다.

  1. 미등록 단어(OOV, Out-of-Vocabulary) 문제: 학습 데이터에 없던 새로운 단어가 테스트 데이터에 등장할 경우, 모델은 이를 처리하지 못하고 [UNK](Unknown) 토큰으로 처리하여 정보 손실이 발생한다.
  2. 어휘 사전 팽창: 언어의 형태소 변화가 심할수록(예: 한국어의 조사, 어미 변화) 사전의 크기가 기하급수적으로 늘어나며, 이는 임베딩 층(Embedding Layer)의 메모리 사용량 증가와 연산 속도 저하로 이어진다.

[표 1] 단어 기반 방식 vs 재구성(서브워드) 방식 비교

구분 단어 기반 방식 (Word-based) 재구성 방식 (Subword-based)
단위 공백 또는 구두점 기준 단어 통계적 빈도 기반의 부분 단어
OOV 처리 불가능 ([UNK] 처리) 가능 (최소 단위인 문자까지 분해)
사전 크기 매우 큼 (수십만~수백만 개) 효율적 (보통 3만~5만 개로 고정)
의미 보존 단어 전체의 의미 보존 형태소/어근 단위의 의미 추론 가능
메모리 효율 낮음 높음

3. 주요 기법 및 알고리즘

어휘 재구성은 주로 서브워드(Subword) 분절 알고리즘을 통해 이루어진다. 이는 자주 등장하는 문자열 조합은 하나의 토큰으로 묶고, 드물게 등장하는 조합은 더 작은 단위로 쪼개는 방식이다.

3.1 BPE (Byte Pair Encoding)

가장 빈번하게 등장하는 문자 쌍(Pair)을 반복적으로 병합하여 새로운 토큰을 만드는 상향식(Bottom-up) 알고리즘이다. - 원리: 모든 문자(Character) 또는 바이트(Byte)를 개별 토큰으로 시작 $\rightarrow$ 가장 빈도가 높은 쌍을 찾아 하나의 토큰으로 병합 $\rightarrow$ 설정한 사전 크기에 도달할 때까지 반복.

3.2 WordPiece

BPE와 유사하지만, 단순 빈도가 아닌 우도(Likelihood)를 기반으로 병합 여부를 결정한다. - 원리: 단순 빈도가 아니라, 두 토큰을 합쳤을 때 학습 데이터의 확률을 얼마나 높이는지(Likelihood gain)를 계산하여 병합한다. 주로 BERT 모델에서 사용되었다.

[예시] BPE vs WordPiece 분절 차이

단어: "unhappiness" - BPE (빈도 중심): un + happi + ness (데이터셋에서 unness가 매우 자주 등장한다면 이 조합을 우선 선택) - WordPiece (확률 중심): un + ##happi + ##ness (각 서브워드가 결합했을 때 전체 말뭉치의 확률을 최대화하는 최적의 분할 지점을 선택)

3.3 SentencePiece

사전 학습된 토크나이저 없이 원문 텍스트(Raw text)에서 직접 어휘 사전을 구축하는 라이브러리이다. - 원리: 공백을 특수 기호(_)로 취급하여 텍스트를 하나의 긴 문자열로 처리하며, BPE나 Unigram 언어 모델 알고리즘을 선택적으로 적용할 수 있다.

[표 2] 알고리즘별 복잡도 및 특성 비교

알고리즘 시간 복잡도 (학습) 공간 복잡도 핵심 기준 주요 특징
BPE $O(N \cdot V)$ $O(V)$ 빈도수 (Frequency) 단순하고 빠름, GPT 계열 사용
WordPiece $O(N \cdot V \cdot \log V)$ $O(V)$ 우도 (Likelihood) 통계적 최적화, BERT 계열 사용
SentencePiece $O(N \cdot V)$ $O(V)$ 확률/빈도 선택 언어 독립적, 다국어 모델 최적화
(N: 코퍼스 크기, V: 어휘 사전 크기)

4. 어휘 재구성 프로세스

어휘 재구성은 일반적으로 다음과 같은 파이프라인을 거친다.

  1. 코퍼스 수집: 대상 도메인의 대규모 텍스트 데이터를 수집한다.
  2. 정규화(Normalization): 유니코드 정규화, 대소문자 통합, 특수문자 처리 등을 수행한다.
  3. 초기 분절: 텍스트를 문자(Character) 또는 바이트(Byte) 단위로 쪼갠다.
  4. 빈도 분석 및 병합: 선택한 알고리즘(BPE 등)에 따라 빈도가 높은 조합을 반복적으로 병합한다.
  5. 사전 확정: 목표로 하는 사전 크기(Vocabulary Size)에 도달하면 최종 토큰 리스트를 확정한다.
  6. 검증 및 평가(Evaluation): 구축된 사전을 통해 실제 텍스트를 토큰화했을 때, 평균 토큰 길이(Sequence Length)가 적절한지, 주요 도메인 단어가 지나치게 쪼개지지 않는지 확인한다.

[코드 예제] BPE 알고리즘의 단순화된 동작 과정 (Python)

import collections

# 1. 초기 데이터: 단어별 빈도수 (문자 단위로 분리된 상태)
vocab = {'l o w ': 5, 'l o w e r ': 2, 'n e w e s t ': 6, 'w i d e s t ': 3}

def get_stats(vocab):
    pairs = collections.defaultdict(int)
    for word, freq in vocab.items():
        symbols = word.split()
        for i in range(len(symbols)-1):
            pairs[symbols[i], symbols[i+1]] += freq
    return pairs

def merge_vocab(pair, v_in):
    v_out = {}
    bigram = ' '.join(pair)
    replacement = ''.join(pair)
    for word in v_in:
        w_out = word.replace(bigram, replacement)
        v_out[w_out] = v_in[word]
    return v_out

# 반복 병합 과정
for i in range(10): 
    pairs = get_stats(vocab)
    if not pairs: break
    best = max(pairs, key=pairs.get) # 가장 빈도가 높은 쌍 선택
    vocab = merge_vocab(best, vocab)
    print(f"Merge {i+1}: {best} -> {''.join(best)}")
    print(f"Current Vocab: {vocab}\n")

"""
[예상 출력 결과]
Merge 1: ('e', 's') -> es
Current Vocab: {'l o w ': 5, 'l o w e r ': 2, 'n e w es t ': 6, 'w i d es t ': 3}

Merge 2: ('es', 't') -> est
Current Vocab: {'l o w ': 5, 'l o w e r ': 2, 'n e w est ': 6, 'w i d est ': 3}

Merge 3: ('n', 'e') -> ne
Current Vocab: {'l o w ': 5, 'l o w e r ': 2, 'ne w est ': 6, 'w i d est ': 3}
... (이후 빈도수에 따라 반복 병합)
"""

5. 활용 및 적용 사례

5.1 최신 LLM의 토크나이저 적용

최근의 대규모 언어 모델(LLM)은 더 효율적인 어휘 재구성을 위해 Byte-level BPE를 채택하고 있다. - GPT-3/4: 유니코드 문자 대신 바이트(Byte) 단위로 BPE를 적용하여, 어떤 언어나 특수문자가 들어와도 [UNK] 토큰 없이 처리할 수 있는 완전한 커버리지를 구현했다. - Llama 3: 이전 버전보다 훨씬 큰 어휘 사전(약 128k 토큰)을 구축하여, 텍스트 압축률을 높이고 다국어 처리 능력을 향상시켰다.

5.2 도메인 특화 사전 구축

일반적인 위키피디아 데이터로 구축된 사전은 전문 용어를 과도하게 분절하는 경향이 있다. - 의료/법률 도메인: Acetaminophen $\rightarrow$ Ace + tamino + phen으로 쪼개지는 경우, 의미 손실이 발생한다. 이를 방지하기 위해 해당 도메인의 코퍼스를 추가하여 전문 용어를 하나의 토큰으로 병합하는 어휘 확장(Vocabulary Expansion) 과정을 거친다.

[예시] 재구성 전후의 토큰화 결과 비교

입력 문장: "Unbelievable performance"

방식 토큰화 결과 비고
단어 기반 ["Unbelievable", "performance"] 사전 없으면 [UNK] 처리
재구성 전 (문자) ["U", "n", "b", "e", "l", "i", ...] 시퀀스 길이가 너무 길어짐
재구성 후 (BPE) ["Un", "believable", " performance"] 의미 단위의 효율적 분절

6. 한계 및 고려사항

6.1 과도한 분절과 의미 손실

사전 크기를 너무 작게 설정하면 단어가 지나치게 잘게 쪼개져(Over-segmentation), 모델이 단어의 전체적인 의미를 파악하는 데 더 많은 연산 자원을 소모하게 되며 문맥 파악 능력이 저하될 수 있다.

6.2 언어별 특성에 따른 전략

  • 교착어 (한국어, 터키어 등): 어근에 조사가 붙는 특성상, 단순 BPE보다는 형태소 분석 선행(Morpheme Analysis)(예: MeCab, Kkma 등 사용) 후 서브워드 분절을 수행하는 것이 훨씬 효율적이다.
    • 사례: "학교에 갔다" $\rightarrow$ (BPE 단독) ["학교", "에", "갔", "다"] (운 좋게 분리될 수 있으나 일관성 부족) $\rightarrow$ (형태소 분석 후 BPE) ["학교"] + ["에"] + ["가"] + ["았"] + ["다"] $\rightarrow$ 통계적 병합을 통해 ["학교에", "갔다"] 등으로 최적화.
  • 고립어 (중국어, 영어 등): 공백이나 통계적 빈도 기반의 분절이 상대적으로 잘 작동한다.

따라서 어휘 재구성 시에는 대상 언어의 문법적 특성과 도메인의 전문성을 고려하여 사전 크기(Vocab Size)분절 알고리즘을 최적화하는 과정이 필수적이다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(gemma-4-31b)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?